"""
dataclasses 模块是在 Python 3.7 中引入的，它提供了一种简单的方式来创建数据类（data classes）。数据类是一种特殊的类，主要用于存储数据，
并且自动生成一些常用的方法，如 __init__、__repr__、__eq__ 等。使用 dataclasses 可以显著减少样板代码，使代码更加简洁和易读。

主要特点
- 自动生成特殊方法：自动生成 __init__、__repr__、__eq__ 等方法。
- 默认值支持：可以为字段指定默认值。
- 类型注解：支持类型注解，提高代码的可读性和可维护性。
- 冻结实例：可以通过 frozen=True 参数创建不可变的数据类。
- 继承支持：支持继承，子类可以扩展父类的功能

用法
- 如何定义一个数据类
- 不可变数据类
- 数据类的继承
- 自定义方法
"""
# 1. 定义一个数据类
from dataclasses import dataclass


@dataclass
class Person:
    name: str
    age: int
    email: str = "unknown@example.com"  # 默认值


# 创建一个 Person 实例
person = Person(name="Alice", age=30)

print(person)  # 输出: Person(name='Alice', age=30, email='unknown@example.com')


# 2. 不可变数据类
@dataclass(frozen=True)
class ImmutablePerson:
    name: str
    age: int


immutable_person = ImmutablePerson(name="Charlie", age=40)


# 尝试修改属性会引发 FrozenInstanceError,编译器会提示报错
# try:
#     immutable_person.age = 41
# except FrozenInstanceError as e:
#     print(e)  # 输出: cannot assign to field 'age'

# 3. 继承
# 默认值参数要放到最后
@dataclass
class Person2:
    name: str
    age: int


@dataclass
class Employee(Person2):
    employee_id: int
    department: str = "General"


employee = Employee(name="David", age=35, employee_id=123, department="Engineering")
print(employee)  # 输出: Employee(name='David', age=35, email='unknown@example.com', employee_id=123, department='Engineering')


@dataclass
class A:
    x: int = 10
    y: int = 20


@dataclass
class B(A):
    x: int = 30
    z: int = 40


b = B()
print(b)


# 4. 自定义方法
@dataclass
class Student:
    name: str
    age: int
    grades: list[int]

    def average_grade(self) -> float:
        return sum(self.grades) / len(self.grades)


student = Student(name="Eve", age=22, grades=[88, 92, 75])
print(student.average_grade())  # 输出: 85.0
